<!DOCTYPE HTML>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
	<title>wiki文档管理系统</title>
	<link rel="shortcut icon" href="webjars/doc-wiki/img/wiki.ico"/>
	<link rel="stylesheet" href="webjars/doc-wiki/css/element-ui.css">
	<link rel="stylesheet" href="webjars/doc-wiki/css/doc-wiki.css" />
</head>
<body>
	<div id="app">
		<el-container style="height: 100%;">
			<el-aside width="auto" style="height: 100%;">
				<div class="logo" @click="aboutDialogVisible = true">zyplayer-doc-wiki</div>
				<div style="padding: 10px;">
					<div align="center"><el-button type="primary" v-on:click="createWiki" icon="el-icon-plus" style="width: 100%;">创建文档</el-button></div>
					<!--<el-row><el-switch v-model="isCollapse"></el-switch></el-row>-->
					<el-input v-model="searchKeywords" placeholder="搜索文档" style="margin: 10px 0;">
						<el-button slot="append" icon="el-icon-search" v-on:click="searchByKeywords"></el-button>
					</el-input>
					<el-tree :data="pathIndex" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
				</div>
			</el-aside>
			<el-main class="doc-body-box">
				<el-row type="border-card">
					<div class="wiki-title">
						狗屎一样的代码如何重构？wiki模块正在开发中，这只是一个预览页面
						<div style="float: right;">
							<el-button type="text" icon="el-icon-edit">编辑</el-button>
							<el-button type="text" icon="el-icon-setting">访问权限</el-button>
						</div>
					</div>
					<div class="wiki-author">
						创建时间：暮光：城中城　2019-2-17 18:44:17　　最后修改：暮光：城中城　2019-2-17 18:44:23
					</div>
					<div class="wiki-files">
						<div style="float: right; margin-bottom: 5px;">
							<el-button icon="el-icon-upload">上传附件</el-button>
						</div>
						<el-table :data="docFileList" border style="width: 100%; margin-bottom: 5px;">
							<el-table-column label="文件名">
								<template slot-scope="scope">
									<a target="_blank" :href="scope.row.name">{{scope.row.name}}</a>
								</template>
							</el-table-column>
							<el-table-column prop="creator" label="创建人"></el-table-column>
							<el-table-column prop="create" label="创建时间"></el-table-column>
						</el-table>
					</div>
					<div class="wiki-content">
						<div class="rich_media_content " id="js_content"><p style="margin-bottom: 15px;letter-spacing: 0.544px;white-space: normal;background-color: rgb(255, 255, 255);text-align: center;" data-mpa-powered-by="yiban.io"></p><p style="white-space: normal;font-size: 14px;letter-spacing: 1.4px;text-align: left;line-height: 2em;">狗屎一样的代码如何重构？</p><p style="white-space: normal;font-size: 14px;letter-spacing: 1.4px;text-align: left;line-height: 2em;">重构不止是代码整理，它提供了一种高效且受控的代码整理技术。</p><h4 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">（一）重构原则</h4><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">1、何谓重构</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">对软件内部结构的一种调整，目的是在不改变软件可观察行为的前提下，提高其可理解性，降低其修改成本。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">另一种解释是：使用一系列重构手法，在不改变软件可观察行为的前提下，调整其结构。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;"><span style="color: rgb(0, 150, 136);font-size: 16px;letter-spacing: 1.4px;text-align: left;">2、为何重构</span><br  /></p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">改进软件设计：如果没有重构，程序的设计会逐渐变质，重构很像是在整理代码，你所做的就是让所有的东西回到应处的位置上。<br  />帮助找到bug：对代码进行重构，可以深入理解代码的作为，在搞清楚程序结构的同时，想不把bug揪出来都难。<br  />提高编程速度：良好的设计是快速开发的根本，改善设计、提高可读性，减少错误，这些都是提高质量。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">3、何时重构</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">任何情况下我都反对专门拨出时间进行重构。重构本来就不是一件应该特别拨出时间做的事情，重构应该随时随地的进行。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;"><strong style="color: rgb(191, 54, 12);">三次法则</strong></p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">第一次做某件事情是只管去做；第二次做类似的事情会产生反感；第三次再做类似的事，你就应该重构</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">最常见的重构时机是想给软件添加新特性的时候；</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">重构的另个一原动力是：代码的设计无法帮助我轻松的添加所需要的特性</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">修改错误的时候，review代码的时重构</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">间接层和重构</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">计算机科学是这样一门科学：它相信所有的问题都可以通过增加一个间接层来解决。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">大多数重构都为程序引入了更多的间接层，重构往往把大型的对象拆成多个小型的对象，把大型的函数拆成多个小型的函数。但是，间接层是一把双刃剑。每次把一个东西分成两份，你就需要多管理一个东西。如果某个对象委托另一个对象，后者又委托另一个对象，程序会愈加难以阅读。推荐阅读：<a href="http://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&amp;mid=2247485281&amp;idx=1&amp;sn=8d2f07fd999ccbf215cb0b47dd1ae17f&amp;chksm=eb538257dc240b414e4fc6995084e8d7e49f39b1a4a246e727e1bfbe04720a58d1c88a623f89&amp;scene=21#wechat_redirect" target="_blank" data-linktype="2">44个Java代码性能优化总结</a>。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">何时不该重构：有时候既有代码实在太混乱，重构它还不如重新写一个来得简单。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">重写而非重构的一个清楚讯号是：现有代码根本不能正常运作。</p><h4 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">（二）代码的坏味道</h4><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">1、重复代码</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果你在一个以上的地点看到相同的程序结构，那么可以肯定：设法将它们合二为一，程序会变得更好 。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">同一个类中有相同的表达式：提炼出重复的代码，然后让两个地方都调用被提炼出来的那一段代码；</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">两个互为兄弟的子类内含有相同的表达式：提炼出相同代码，将它推入超类内；</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">两个毫不相干的类中出现：将重复的代码提炼到一个独立的类中。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">2、过长的类</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">拥有短函数的对象活得比较好、比较长。 间接层所能带来的全部利益——解释能力、共享能力、选择能力——都是由小型函数支持的。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">每当感觉需要以注释来说明点什么的时候，我们就把需要说明的东西写进一个独立的函数中。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如何确定提炼哪一段代码？寻找注释是一个很好的技巧。它们通常能指出代码用途和实现手法之间的语义距离。如果代码前方有一行注释，就是提醒你：可以将这段代码替换成一个函数。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">条件表达式和循环常常也是提炼的信号。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">3、过大的类</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果想利用单个类做太多的事情，其内往往就会出现太多实力变量。<br  />类内如果有太多代码，也是代码重复、混乱病最终走向死亡的源头。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">4、过长参数列</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">太长的参数列难以理解，太多的参数会造成前后不一致、不容易使用，而且一旦你需要更多数据，就不得不修改它。如果将对象传递给函数，大多数修改都将没有必要。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">5、发散式变化</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果某个类经常因为不同的原因在不同的方向上发生变化，那么此时也许将这个对象分成两个会更好，这么一来每个对象就可以只因为一种变化而需要修改。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">6、散弹式修改</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果没遇到某种变化，你都必须在许多不同的类内做出许多小修改，你所面临的坏味道就是散弹式修改。如果需要修改的代码散布四处，你不但很难找到它们，也很容易忘记某个重要的修改。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">把所有需要修改的代码放进同一个类中，如果眼下没有合适的类可以安置这些代码就创造一个。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">7、依恋情结</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">对象技术的要点在于：将数据和对数据的操作行为包装在一起.有一种经典的气味是：函数对某个类的兴趣高过对自己所处类的兴趣。某个函数为了计算某个值，从另一个对象那调用几乎半打的取值函数。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">一个函数往往会用到几个类的功能，那么它该置于何处？我们的原则是：判断哪个类拥有最大被此函数使用的数据，然后就把这个函数和那些数据放在一起。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">8、数据泥团</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">很多地方看到相同的三四项数据一起出现。这些总是绑在一起出现的数据应该拥有属于他们自己的对象。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">首先找到这些数据以字段形式出现的地方，将它们提炼到一个独立的对象中。这么做的直接好处是可以将很多参数列缩短简化函数调用。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">9、基本类型偏执</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">对象的一个极大价值在于：它们模糊了横旦与基本数据和体积较大的类之间的界限</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">对象技术的新手通常不愿意在小任务上运用小对象——结合数值和比重的money类、有一个起始值和一个结束值组成的range类。将原本单独存在的数值替换成对象，从而走出传统的洞窟，进入炙手可热的对象世界。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">10、switch惊悚现身</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">面向对象的一个最明显的特征是：少用switch语句一看到switch语句，就应该考虑以多态来替换它。<span style="font-size: 14px;letter-spacing: 1.4px;text-align: left;">推荐阅读：<a href="http://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&amp;mid=2247485927&amp;idx=2&amp;sn=d1c4521b27d4b473aea09386b4794b64&amp;chksm=eb538cd1dc2405c7b553b7d0c16a9d28564778a0b0856b27ab7b7697ec27ba8a6a8e23dddb36&amp;scene=21#wechat_redirect" target="_blank" data-linktype="2">switch支持的 6 种数据类型！</a></span></p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果只是在单一函数中有些选择实例，且并不想改动它们，那么多态就有点杀鸡用牛刀了。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">11、平行集成体系</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">每当你为某个类增加一个子类，必须也为另一个类相应增加一个子类。<br  />消除这种重复性的一般策略是：让一个继承体系的实例引用另一个继承体系的实例。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">12、冗余类</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">某个类原本对得起自己的身价，但重构使它身形缩水，不再做那么多工作，这个时候请让这个类庄严赴义吧。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">13、夸夸其谈未来性</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">企图以各种各样的钩子和特殊情况来处理一些非必要的事情，这种怀味道就出现了。如果用到了那就值得去做，如果用不到那就不值得，只会挡你的路，所以把它挪开吧。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果你的某个抽象类其实没有起到太大的作用，函数上的某些参数未被使用…可以移除它们了。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">14、令人迷惑的暂时字段</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">某个实例变量仅为某种特定的情况而设。这样的代码让人不易理解。在变量未被使用的情况下猜测当初其设置目的，会让你发疯的。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">15、过度耦合消息链</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果你看到用户向一个对象请求另一个对象，然后再向后者请求另一个对象，然后再请求另个一对象……..这就是消息链。采用这种方式，意味着客户代码将与查找过程中的导航结构紧密耦合。一旦对象间的关系发生任何变化，客户端就不得不做出相应的修改。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">16、中间人</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">封装往往伴随着委托。你也许会看到某个类接口有一半的函数都委托给其他类，这样就是过度运用。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">17、狎昵关系</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">有时会看到两个类过于亲密，话费太多的时间去探究彼此的private成分。过分狎昵的类必须拆散，帮它们划清界线，从而减少狎昵行径。<br  />继承往往造成过度亲密，因为子类对超类的了解总是超过后者的主观愿望。如果你觉得该让孩子独立生活了，让他离开继承。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">18、异曲同工的类</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">两个函数做同一件事，却有着不同的签名。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">19、不完美的类库</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">类库函数构造的不够好，又不能修改它们：</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果只想修改类的一两个函数，可以引入外加函数。如果想要添加一大堆额外行为，建立一个新类包含这些额外行为，让其成为子类。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">20、纯稚的数据类</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">纯稚的数据类是指：它们拥有一些字段，以及用于访问（读写）这些字段的函数，除此之外一无长物。</p><ul class=" list-paddingleft-2" style="list-style-type: circle;margin-left: 5px;margin-right: 5px;"><li><p style="text-align: left;line-height: 2em;"><span style="font-size: 14px;">封装public字段;</span></p></li><li><p style="text-align: left;line-height: 2em;"><span style="font-size: 14px;">恰当封装容器类字段;</span></p></li><li><p style="text-align: left;line-height: 2em;"><span style="font-size: 14px;">移除不应修改的字段的设置函数;</span></p></li><li><p style="text-align: left;line-height: 2em;"><span style="font-size: 14px;">提炼调用函数以隐藏取值/设值函数;</span></p></li></ul><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">21、被拒绝的遗赠</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">子类只运用了父类的一部分函数和数据。 为子类建立一个兄弟类,将所有用不到的字段/函数下移至兄弟类,保证超类的纯粹;</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">22、过多的注释</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">注释之所以存在是因为代码很糟糕 。注释的最高境界——代码即注释。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">当你感觉需要撰写注释时，请先尝试重构，试着让所有的注释都变得多余。</p><h4 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">（三）重新组织函数</h4><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">1、提炼函数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;"><strong style="color: rgb(191, 54, 12);">动机：</strong>看到一个过长的函数或者一段需要注释才能让人理解用途的代码，将这段代码放一个独立的函数中；<br  />做法：</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">创造一个新函数，根据这个函数的意图来命名它；</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">只要新函数的名称能够以更好的方式昭示代码意图，你也应该提炼它。但如果想不到一个更有意义的名称就别动</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">将提炼的代码从原函数复制到新建的目标函数中；<br  />将被提炼代码段中需要读取的局部变量，当作参数传递给目标函数；<br  />在源函数中，将被提炼代码段替换为目标函数调用。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">2、内联函数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">一个函数的本体与名称同样清楚易懂。在函数调用点插入函数本体，然后移除该函数。<br  />动机：</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">一群组织不甚合理的函数。你可以将它们都内联到一个大函数中，再从中提炼出组织合理的小型函数。<br  />使用的太多的间接层，使得系统中的所有函数都似乎只是对另一个函数的简单委托，造成在委托动作之间晕头转向。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;"><strong style="color: rgb(191, 54, 12);">做法：</strong></p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">1、检查函数，确定不具备多态；</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果子类继承了这个函数，就不要将此函数内联，因为子类无法复写一个根本不存在的函数。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">2、找出这个函数的所有调用点；</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">3、将这个函数的所有调用点都替换成函数本体。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">3、内联临时变量</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">有一个临时变量，只被一个简单的表达是赋值一次，而它妨碍了其他重构手法。将所有对该变量的引用动作，替换为对它赋值的那个表达式自身<br  />double basePrice = anOrder.basePrice();<br  />return (base &gt; 10000 );</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">替换为：</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">return (anOrder.basePrice &gt; 1000);</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">4、以查询取代临时变量</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你的程序以一个临时变量保存某一表达式的运算结果。将这个表达式提炼到一个独立的函数中。将这个临时变量的所有引用点替换为对新函数的调用。此后，新函数就可被其他函数使用。</p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 40px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">double</span> basePrice = quantity * timePrice;<br  /><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 14px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">if</span>(basePrice &gt; <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">1000</span>){<br  /> &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">return</span> basePrice * <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">09.5</span>;<br  />} <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">else</span> {<br  /> &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">return</span> basePrice * <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">0.98</span>;<br  />}</p></pre></section><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">替换为：<br  /></p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 14px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">if</span>(basePrice() &gt; <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">1000</span>){<br  /> &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">return</span> basePrice * <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">09.5</span>;<br  />} <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">else</span> {<br  /> &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">return</span> basePrice * <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">0.98</span>;<br  />}<br  /><span class="hljs-default-function" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 118px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 40px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">double</span> <span class="hljs-default-title" style="color: rgb(97, 174, 238);background: rgba(0, 0, 0, 0);display: inline;width: 59px;text-decoration: none solid rgb(97, 174, 238);font-weight: 400;font-style: normal;">basePrice</span><span class="hljs-default-params" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 13px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;">()</span></span>{<br  /> &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">return</span> quantity * timePrice;<br  />}</p></pre></section><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">临时变量只在所属的函数中可见，如果把临时变量替换为一个查询，那么同一个类中的所有函数都将可以获得这个份信息，这将带给你极大的帮助，使你能够为这个类编写更清晰的代码。<br  /></p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">5、引入注释性变量</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你有一个复杂的表达式。将该复杂表达式（或其中一部分）的结果放进一个临时变量，以此变量名称来解释表达式用途。</p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 14px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">if</span> ((platform.toUpperCase().indexOf(<span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 33px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">"MAC"</span>) &gt; -<span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 6px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">1</span>) &amp;&amp; (browser.toUpperCase().indexOf(<span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">"IE"</span>) &gt; -<span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 6px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">1</span>) &amp;&amp; wasInitialized() &amp;&amp; <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">resize</span> &gt;<span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 6px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">0</span>){<br  /> &nbsp; &nbsp;//<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 13px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">do</span> smothing<br  />}</p></pre></section><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">替换为：</p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 33px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">final</span> <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 45px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">boolean</span> isMacOs = platform.toUpperCase().indexOf(<span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 33px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">"MAC"</span>) &gt; -<span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 6px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">1</span>;<br  /><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 33px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">final</span> <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 45px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">boolean</span> isIEBrowser = browser.toUpperCase().indexOf(<span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">"IE"</span>) &gt; -<span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 6px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">1</span>;<br  /><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 33px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">final</span> <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 45px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">boolean</span> wasResized = resize &gt;<span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 7px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">0</span>;<br  /><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 14px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">if</span>(isMacOs &amp;&amp; isIEBrowser &amp;&amp; wasInitialized() &amp;&amp; wasResized){<br  /> &nbsp; &nbsp;<span class="hljs-default-comment" style="color: rgb(92, 99, 112);background: rgba(0, 0, 0, 0);display: inline;width: 85px;text-decoration: none solid rgb(92, 99, 112);font-weight: 400;font-style: italic;">//do smothing</span><br  />}</p></pre></section><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">表达式有可能非常复杂难以理解。这种情况下，临时变量可以帮助你将表达式分解为比较容易管理的形式。<br  /></p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">在条件逻辑中，你可以用这项重构将每个条件子句提炼出来，以一个良好命名的临时变量来解释对应条件子句的意义。另一种情况是：在较长的算法中，可以运用临时变量来解释每一步运算的意义。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">6、分解临时变量</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你的程序有某个临时变量被赋值超过一次，它既不是循环变量，也不被用于收集计算结果。 针对每次赋值，创造一个独立、对应的临时变量。</p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 40px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">double</span> temp = <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 6px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">2</span> * (height + width);<br  />System.<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 19px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">out</span>.println(temp);<br  />temp = height * width;<br  />System.<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 19px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">out</span>.println(temp);</p></pre></section><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">替换为：<br  /></p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 40px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">double</span> perimeter = <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 6px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">2</span> * (height + width);<br  />System.<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 19px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">out</span>.println(perimeter);<br  /><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 40px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">double</span> area = height * width;<br  />System.<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 19px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">out</span>.println(area);</p></pre></section><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果临时变量被赋值超过一次，就意味着它们在函数中承担了一个以上的责任。如果临时变量承担多个责任，它就应该被替换为多个临时变量。每个变量只承担一个责任，同一个临时变量承担两件不同的事情会令代码阅读者糊涂<br  /></p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">7、移除对参数的赋值</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">代码对一个参数进行复制。以一个临时变量取代该参数的位置。</p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-function" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 374px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> <span class="hljs-default-title" style="color: rgb(97, 174, 238);background: rgba(0, 0, 0, 0);display: inline;width: 53px;text-decoration: none solid rgb(97, 174, 238);font-weight: 400;font-style: normal;">discount</span> <span class="hljs-default-params" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 288px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;">(<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> inputVal, <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> quantity, <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 19px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> yearToData)</span></span>{<br  /> &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 14px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">if</span>(inputVal &gt; <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 13px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">50</span>) inputVal -= <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 6px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">2</span>;<br  />}</p></pre></section><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">替换为：<br  /></p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-function" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 374px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> <span class="hljs-default-title" style="color: rgb(97, 174, 238);background: rgba(0, 0, 0, 0);display: inline;width: 53px;text-decoration: none solid rgb(97, 174, 238);font-weight: 400;font-style: normal;">discount</span> <span class="hljs-default-params" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 288px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;">(<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> inputVal, <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> quantity, <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 19px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> yearToData)</span></span>{<br  /> &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> result = inputVal;<br  /> &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 14px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">if</span>(inputVal &gt; <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 13px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">50</span>) result -= <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 6px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">2</span>;<br  />}</p></pre></section><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果代码的语义是按引用传递的，请在调用段检查调用后是否还使用了这个参数。<br  /></p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">8、替换算法</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">想要把某个算法替换为另一个更清晰的算法。将函数本体替换成为另一个算法。</p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-function" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 229px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;">String <span class="hljs-default-title" style="color: rgb(97, 174, 238);background: rgba(0, 0, 0, 0);display: inline;width: 72px;text-decoration: none solid rgb(97, 174, 238);font-weight: 400;font-style: normal;">foundPerson</span>(<span class="hljs-default-params" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 98px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;">String[] people</span>)</span>{<br  /> &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">for</span>(<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> i = <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 6px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">0</span>;i &lt; people.length; i++){<br  /> &nbsp; &nbsp; &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 13px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">if</span>(people[i].<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">equals</span>(<span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 33px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">"Don"</span>)){<br  /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">return</span> <span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 33px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">"Don"</span>;<br  /> &nbsp; &nbsp; &nbsp; &nbsp;}<br  /> &nbsp; &nbsp; &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 13px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">if</span>(people[i].<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">equals</span>(<span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">"John"</span>)){<br  /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">return</span> <span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">"John"</span>;<br  /> &nbsp; &nbsp; &nbsp; &nbsp;}<br  /> &nbsp; &nbsp; &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 13px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">if</span>(people[i].<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">equals</span>(<span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">"Kent"</span>)){<br  /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">return</span> <span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">"Kent"</span>;<br  /> &nbsp; &nbsp; &nbsp; &nbsp;}<br  /> &nbsp; &nbsp;}<br  /> &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">return</span> <span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 13px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">""</span>;<br  />}</p></pre></section><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">替换为：<br  /></p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-built_in" style="color: rgb(230, 192, 123);background: rgba(0, 0, 0, 0);display: inline;width: 40px;text-decoration: none solid rgb(230, 192, 123);font-weight: 400;font-style: normal;">String</span> foundPerson(<span class="hljs-default-built_in" style="color: rgb(230, 192, 123);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(230, 192, 123);font-weight: 400;font-style: normal;">String</span>[] people){<br  /> &nbsp; &nbsp;List candidates = Arrays.asList(<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 19px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">new</span> <span class="hljs-default-built_in" style="color: rgb(230, 192, 123);background: rgba(0, 0, 0, 0);display: inline;width: 40px;text-decoration: none solid rgb(230, 192, 123);font-weight: 400;font-style: normal;">String</span>[]{<span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 33px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">"Don"</span>, <span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 40px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">"John"</span>, <span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">"Kent"</span>});<br  /> &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">for</span>(int i = <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 6px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">0</span>;i &lt; people.length; i++){<br  /> &nbsp; &nbsp; &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 13px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">if</span>(candidates.contains(people[i])){<br  /> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">return</span> prople[i];<br  /> &nbsp; &nbsp; &nbsp; &nbsp;}<br  /> &nbsp; &nbsp;}<br  /> &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">return</span> <span class="hljs-default-string" style="color: rgb(152, 195, 121);background: rgba(0, 0, 0, 0);display: inline;width: 13px;text-decoration: none solid rgb(152, 195, 121);font-weight: 400;font-style: normal;">""</span>;<br  />}</p></pre></section><h4 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">（四）在对象之间搬移特性<br  /></h4><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">在对象设计过程中，决定把责任放在哪儿是即使不是最重要的事，也是最重要的事之一。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">常常只使用搬移函数和搬移字段简单地移动对象行为，就可以解决这些问题。如果这两个重构手法都需要用到，我会首先使用搬移字段，再使用搬移方法。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果一个类承担了太多责任而变得臃肿不堪，这种情况下会使用提炼类将一部分责任分离出去。如果一个类变得太不负责任，使用将类内联化将它融入到另一个类中。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">1、搬移函数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你的程序中，有个函数与其所驻类之外的另个一类进行跟过的交流：调用后者或被后者调用。在该函数最长引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数，或者将旧函数完全移除。<br  />如果一个类有太多行为，或如果一个类与另一个类有太多合作而高度耦合，就需要搬移函数。可以是系统中的类更简单</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">2、搬移字段</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">程序中，某个字段被其所驻类之外的另一个类更多的用到。在目标类新建一个字段，修改原字段的所有用户，令他们改用新字段</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">3、提炼类</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">某个类做了应该由两个类做的事。建立一个新类，将相关字段和函数从就类搬到新类。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">4、将类内联化</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">某个类没有做太多的事情，不在承担足够责任，不再有的那单独存在的理由。将这个类的所有特性搬移到另一个类中，然后移除原类。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">5、隐藏“委托关系”</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">客户通过一个委托类来调用另一个对象。在服务类上建立客户所需要的所有函数，用来隐藏委托关系。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">封装意味每个对象都应该少了解系统的其他部分。一旦发生变化，需要了解这一变化的对象就会比较少。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果某个客户先通过服务对象的字段得到另一个对象，然后调用后者的函数。那么客户就必须知晓这一层委托关系。万一委托关系变化，客户也要相应变化。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">6、移除中间人</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">某个类做了过多的简单委托。让客户直接调用委托类。<br  />每当客户要使用手委托类的新特性时，你就必须在服务端添加一个简单委托函数。随着受委托类的特性越来越多，这一过程会让你很痛苦。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">7、引入外加函数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你需要为提供服务的类增加一个函数，但你无法修改这个类。在客户类中建立一个函数，并以第一参数形式传入一个服务类实例。</p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-built_in" style="color: rgb(230, 192, 123);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(230, 192, 123);font-weight: 400;font-style: normal;">Date</span> newStart = <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 19px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">new</span> <span class="hljs-default-built_in" style="color: rgb(230, 192, 123);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(230, 192, 123);font-weight: 400;font-style: normal;">Date</span>(year, month, date + <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 6px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">1</span>);</p></pre></section><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">替换为：<br  /></p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-built_in" style="color: rgb(230, 192, 123);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(230, 192, 123);font-weight: 400;font-style: normal;">Date</span> newStart = nextDay(nowDate);<br  /><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 46px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">private</span> <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">static</span> <span class="hljs-default-built_in" style="color: rgb(230, 192, 123);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(230, 192, 123);font-weight: 400;font-style: normal;">Date</span> nextDay(<span class="hljs-default-built_in" style="color: rgb(230, 192, 123);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(230, 192, 123);font-weight: 400;font-style: normal;">Date</span> arg){<br  /> &nbsp; &nbsp;retrun <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 19px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">new</span> <span class="hljs-default-built_in" style="color: rgb(230, 192, 123);background: rgba(0, 0, 0, 0);display: inline;width: 26px;text-decoration: none solid rgb(230, 192, 123);font-weight: 400;font-style: normal;">Date</span>(arg.getYear(), arg.getMonth(), arg.getDate() + <span class="hljs-default-number" style="color: rgb(209, 154, 102);background: rgba(0, 0, 0, 0);display: inline;width: 6px;text-decoration: none solid rgb(209, 154, 102);font-weight: 400;font-style: normal;">1</span>);<br  />}</p></pre></section><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">如果可以修改源码，你可以自行添加一个新函数；如果不能，你就得在客户端编码，补足你要的那个函数<br  /></p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">8、引入本地扩展</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你需要为服务类踢狗一些额外函数，但你无法修改这个类。建立一个新类，使它包含这些额外函数。让这个扩展品成为源类的子类或包装类。<span style="font-size: 14px;letter-spacing: 1.4px;text-align: left;">推荐阅读：</span><a href="http://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&amp;mid=2247485281&amp;idx=1&amp;sn=8d2f07fd999ccbf215cb0b47dd1ae17f&amp;chksm=eb538257dc240b414e4fc6995084e8d7e49f39b1a4a246e727e1bfbe04720a58d1c88a623f89&amp;scene=21#wechat_redirect" target="_blank" style="font-size: 14px;letter-spacing: 1.4px;text-align: left;white-space: normal;" data-linktype="2">44个Java代码性能优化总结</a><span style="font-size: 14px;letter-spacing: 1.4px;text-align: left;">。</span></p><h4 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">（五）重新组织数据</h4><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">1、自封装字段</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">直接访问一个字段。为这个字段建立取值/设值函数，并且只以这些函数来访问字段。</p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 46px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">private</span> <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> low, high;<br  /><span class="hljs-default-function" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 164px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 46px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">boolean</span> <span class="hljs-default-title" style="color: rgb(97, 174, 238);background: rgba(0, 0, 0, 0);display: inline;width: 53px;text-decoration: none solid rgb(97, 174, 238);font-weight: 400;font-style: normal;">includes</span><span class="hljs-default-params" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 58px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;">(<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 19px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> arg)</span></span>{<br  /> &nbsp; &nbsp;retrun arg &gt;= low &amp;&amp; arg &lt;= high;<br  />}</p></pre></section><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">替换为：<br  /></p><section data-mpa-preserve-tpl-color="t" data-mpa-template="t" class="mpa-template" mpa-preserve="t"><pre style="margin:0;padding:0;border-radius:none;background:none;"><p style="border-radius: 4px;font-size: 0.85em;margin: 0px 0.15em;background: rgb(40, 44, 52);color: rgb(171, 178, 191);display: block;padding: 5.95px;overflow-x: auto;white-space: nowrap;text-align: left;line-height: 2em;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 46px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">private</span> <span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> low, high;<br  /><span class="hljs-default-function" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 164px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 46px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">boolean</span> <span class="hljs-default-title" style="color: rgb(97, 174, 238);background: rgba(0, 0, 0, 0);display: inline;width: 53px;text-decoration: none solid rgb(97, 174, 238);font-weight: 400;font-style: normal;">includes</span><span class="hljs-default-params" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 58px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;">(<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 19px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> arg)</span></span>{<br  /> &nbsp; &nbsp;retrun arg &gt;= getLow() &amp;&amp; arg &lt;= getHigh();<br  />}<br  /><span class="hljs-default-function" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 79px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> <span class="hljs-default-title" style="color: rgb(97, 174, 238);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(97, 174, 238);font-weight: 400;font-style: normal;">getLow</span><span class="hljs-default-params" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 14px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;">()</span></span>{<br  /> &nbsp; &nbsp;retrun low;<br  />}<br  /><span class="hljs-default-function" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 85px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;"><span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 20px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">int</span> <span class="hljs-default-title" style="color: rgb(97, 174, 238);background: rgba(0, 0, 0, 0);display: inline;width: 46px;text-decoration: none solid rgb(97, 174, 238);font-weight: 400;font-style: normal;">getHigh</span><span class="hljs-default-params" style="color: rgb(171, 178, 191);background: rgba(0, 0, 0, 0);display: inline;width: 13px;text-decoration: none solid rgb(171, 178, 191);font-weight: 400;font-style: normal;">()</span></span>{<br  /> &nbsp; &nbsp;<span class="hljs-default-keyword" style="color: rgb(198, 120, 221);background: rgba(0, 0, 0, 0);display: inline;width: 39px;text-decoration: none solid rgb(198, 120, 221);font-weight: 400;font-style: normal;">return</span> high;<br  />}</p></pre></section><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;"><strong style="color: rgb(191, 54, 12);">在“字段访问方式”这个问题上，存在两种截然不同的观点：</strong><br  /></p><ul class=" list-paddingleft-2" style="list-style-type: circle;margin-left: 5px;margin-right: 5px;"><li><p style="text-align: left;line-height: 2em;"><span style="font-size: 14px;">在该变量定义所在的类中，你可以自由的访问。</span></p></li><li><p style="text-align: left;line-height: 2em;"><span style="font-size: 14px;">即使在这个类中你也应该只使用访问函数间接访问。<br  />*间接访问的好处是：子类可以通过复写一个函数而改变获取数据的途径；它支持更灵活的数据管理方式，例如延迟初始化。</span></p></li></ul><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">2、以对象取代数据值</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你有一个数据项，需要与其他数据和行为一起使用才有意义。将数据项变为对象。</p><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">一开始你肯能会用一个字符串来表示“电话号码”概念，但是随后你会发现，电话号码需要“格式化”、“区号”之类的行为。这时候就需要为带替换的数值新建一个类。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">3、将值对象改为引用对象</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你从一个类衍生出许多彼此相等的实例，希望将它们替换为同一个对象。将这个值对象变成引用对象。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">4、将引用对象改为值对象</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你有一个引用对象，很小且不可改变，而且不易管理。将它变成一个值对象。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">5、以对象取代数组</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你有一个数组，其中的元素各自代表不同的东西。以对象替换数组。对于数组中的每个元素，以一个字段来表示</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">6、复制“被监视数据”</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你有一些领域数据置身GUI控件中，而领域函数需要访问这些数据。将该数据复制到一个领域对象中。建立一个Observer模式，用以同步领域对象和GUI对象内的重复数据。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">7、将单向关联改为双向关联</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">两个类都需要使用对方特性，但其间只有一条单向连接。添加一个反向指针，并使修改函数能够同时更新两条连接。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">8、将双向关联改为单向关联</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">两个类之间有双向关联，但其中一个类如今不再需要另一个类的特性。去除不必要的关联。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">9、以字面常量取代魔数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你有一个字面数值，带有特别含义。 创造一个常量，根据其意义为它命名，并将上述的字面数值替换为常量。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">10、封装字段</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你的类中存在一个public字段。将它声明为private，并提供相应的访问函数。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">11、封装集合</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">有个函数返回一个集合。让这个函数返回该集合的一个只读副本，并在这个类中提供添加/移除集合元素的函数。</p><h4 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">（六）简化条件表达式</h4><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">1、分解条件表达式</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">有一复杂的条件语句。从if、then、else三个段落中分别提炼出独立函数。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">2、合并表达式</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你有一系列条件测试，都得到相同结果。将这些测试合并为一个条件表达式，并将这个条件表达式提炼成一个独立函数。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">3、合并重复的条件代码</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">在表达式的每个分支上都执行了相同的一段代码。 将这段重复代码搬移到条件表达式之外。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">4、移除控制标记</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">在一系列布尔表达式中,某个变量带有”控制标记”的作用。 以break/return语句取代控制标记。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">5、以多态取代条件表达式</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">有个条件表达式根据对象类型的不同而选择不同的行为。 将这个条件表达式的每个分支放进一个子类内的覆写函数中，然后将原始函数声明为抽象函数</p><h4 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">（七）简化函数调用</h4><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">1、函数改名</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">函数的名称未能揭示其用途。 修改函数名称。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">2、添加参数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">某个函数需要从调用端得到更多信息。为此函数添加一个对象参数，让该对象带仅函数所需信息。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">3、移除参数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">函数本体不再需要某个参数。 去除参数。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">4、分离查询函数和修改函数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">某个函数既返回对象状态值，又修改对象值。 建立两个不同函数,其中一个负责查询,另一个负责修改。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">5、令函数携带参数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">若干函数做了类似的工作，但在函数本体中包含了不同的值。建立单一函数,以参数表达那些不同的值。<br  />有这样两个函数：它们做着类似的工作，但因少数几个值致使行为略有不同。在这种情况下，你可以将这些各自分离的函数同一起来，并通过参数来处理那些变化情况，用以简化问题。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">6、以明确函数取代参数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你有一个函数，其中完全取决于参数值而采用不同行为。 针对该参数的每一个可能值，建立一个独立函数。<br  />如果某个参数有多种可能的值，而函数内又以条件表达式检查这些参数值，并根据不同参数值做出不同的行为，那么就应该使用本项重构。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">7、保持对象完整</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">从某个对象中取出若干值，将它们作为某一次函数调用时的参数。改为传递整个对象。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">8、以函数取代参数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">对象调用某个函数，并将所得结果作为参数，传递给另一函数，而接受该参数的函数本身也能够调用前一个函数。让参数接受者去除该参数，直接调用前一个函数。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">9、引入参数对象</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">某些参数总是很自然的同时出现。以一个对象取代这些参数。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">10、移除设值函数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">类中某个字段在对象创建时被设值，然后不再改变。去掉该字段的所有设值函数。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">11、隐藏函数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">某个函数，从来没有被其他任何类用到 。将函数修改为private。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">12 、以工厂函数取代构造函数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">希望在创建对象时不仅仅是做简单的建构动作 。 将构造函数替换为工厂函数。</p><h4 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">（八）处理概括关系</h4><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">1、字段上移</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">两个子类拥有相同的字段。将该字段移至超类。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">2 、函数上移</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">有些函数在各子类中产生完全相同的结果。将该函数移至超类。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">3 、构造函数本体上移</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">各个子类中有一些构造函数本体几乎完全一致 。在超类中新建一个构造函数，并在子类构造函数中调用它。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">4、函数下移</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">超类中的某个函数只与部分(而非全部)子类用到。 将函数移到相关的子类中。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">5、字段下移</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">超类中的某个字段只被部分(而非全部)子类用到。 将字段移到需要它的子类中。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">6、提炼子类</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">类中的某些特性只被某些(而非全部)实例用到。 新建一个子类，将上述部分的特性移到子类中。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">7、提炼超类</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">两个类有相似特性。 为这两个类建立一个超类,将相同特性移至超类。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">8、提炼接口</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">若干客户使用类接口中的同一子集，或两个类的接口有部分相同。将相同的子集提炼到一个独立接口中。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">9、折叠继承体系</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">超类和子类之间无太大区别。 将它们合为一体。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">10、塑造模板函数</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">子类中某些函数以相同顺序执行类似操作，但各操作细节略有不同。将操作放进独立函数(保持签名相同)，然后将它们移至超类。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">11、以委托取代继承</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">某个子类只使用超类接口中的一部分或根本不需要继承而来的数据。子类新建字段保存超类，调整子类函数为委托超类，取消继承关系。</p><h6 style="margin-top: 20px;margin-bottom: 10px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;color: rgb(0, 150, 136) !important;">12、以继承取代委托</h6><p style="font-size: 14px;letter-spacing: 1.4px;white-space: normal;text-align: left;line-height: 2em;">你在两个类中使用委托关系，并经常为整个接口编写许多极简单的委托函数。`让委托类继承受托类。</p><section class="mpa-template" data-mpa-template-id="1169482" data-mpa-color="null" data-mpa-category="收藏"><p><strong style="text-align: left;font-family: -apple-system-font, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, Arial, sans-serif;color: rgb(64, 118, 0);font-size: 18px;max-width: 100%;box-sizing: border-box !important;overflow-wrap: break-word !important;word-break: normal !important;"><span style="max-width: 100%;letter-spacing: 2px;box-sizing: border-box !important;overflow-wrap: break-word !important;word-break: normal !important;">最近干货分享</span></strong></p><p style="margin-top: 10px;margin-bottom: 10px;max-width: 100%;min-height: 1em;color: inherit;white-space: normal;background-color: rgb(255, 255, 255);font-size: 14px;line-height: 2em;text-align: left;word-wrap: break-word !important;box-sizing: border-box !important;overflow-wrap: break-word !important;word-break: normal !important;"><a href="http://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&amp;mid=2247488437&amp;idx=1&amp;sn=2f8a2adadb9b7ffc434bf0e16e94ce57&amp;chksm=eb539683dc241f955f098ef1f7d82e946c70a75d4e5997693c4345158f4bc3918610c21dd281&amp;scene=21#wechat_redirect" target="_blank" style="font-size: 14px;text-decoration: underline;" data-linktype="2"><span style="font-size: 14px;">Java程序员必学：Spring全家桶学习指南！</span></a><br style="max-width: 100%;word-wrap: break-word !important;box-sizing: border-box !important;overflow-wrap: break-word !important;word-break: normal !important;"  /></p><p style="margin-top: 15px;margin-bottom: 10px;max-width: 100%;min-height: 1em;color: inherit;white-space: normal;background-color: rgb(255, 255, 255);font-size: 14px;line-height: 2em;text-align: left;word-wrap: break-word !important;box-sizing: border-box !important;overflow-wrap: break-word !important;word-break: normal !important;"><a href="http://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&amp;mid=2247488437&amp;idx=2&amp;sn=aa52e761ff9bef7b583730f3a8974702&amp;chksm=eb539683dc241f95427931fbd0cda855770d4a5c48b9de92e36720869703471fc409973dcd4c&amp;scene=21#wechat_redirect" target="_blank" style="font-size: 14px;text-decoration: underline;" data-linktype="2"><span style="font-size: 14px;">Java 11 比 Java 8 究竟快多少？</span></a><br style="max-width: 100%;word-wrap: break-word !important;box-sizing: border-box !important;"  /></p><p style="margin-top: 15px;margin-bottom: 10px;max-width: 100%;min-height: 1em;color: inherit;white-space: normal;background-color: rgb(255, 255, 255);font-size: 14px;line-height: 2em;box-sizing: border-box !important;overflow-wrap: break-word !important;word-break: normal !important;text-align: left;"><a href="http://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&amp;mid=2247488421&amp;idx=1&amp;sn=bb00fd53631e61f50b99984a7b7c2723&amp;chksm=eb539693dc241f85e3e2dae6b25006e43213ed99f6a2a63ae9cd075699c8174d825930d2c678&amp;scene=21#wechat_redirect" target="_blank" style="font-size: 14px;text-decoration: underline;" data-linktype="2"><span style="font-size: 14px;">月薪 2W+ 程序员，过年相亲，三次遭拒！</span></a><br  /></p><p style="margin-top: 10px;margin-bottom: 10px;max-width: 100%;min-height: 1em;color: inherit;white-space: normal;background-color: rgb(255, 255, 255);line-height: 2em;text-align: left;word-wrap: break-word !important;box-sizing: border-box !important;overflow-wrap: break-word !important;word-break: normal !important;"><a href="http://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&amp;mid=2247488443&amp;idx=1&amp;sn=75a49a28ff58d93db5e95ffa2bed3905&amp;chksm=eb53968ddc241f9b210be799ba09d58582eff238ddbbdcd5fdab1cec79ffdf6ef02c302cfab0&amp;scene=21#wechat_redirect" target="_blank" style="font-size: 14px;text-decoration: underline;" data-linktype="2"><span style="font-size: 14px;">把 14 亿人拉到一个微信群，如何实现？</span></a><br style="max-width: 100%;word-wrap: break-word !important;box-sizing: border-box !important;"  /></p><p style="margin-top: 10px;margin-bottom: 10px;max-width: 100%;min-height: 1em;color: inherit;white-space: normal;background-color: rgb(255, 255, 255);line-height: 2em;text-align: left;word-wrap: break-word !important;box-sizing: border-box !important;overflow-wrap: break-word !important;word-break: normal !important;"><a href="http://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&amp;mid=2247488448&amp;idx=2&amp;sn=766d1d2dfd54f0723a5a1b9efdcbcd7e&amp;chksm=eb5396f6dc241fe00126ebe4039da2bc837bbec8874c330997b66b4160d42f342e2e81294414&amp;scene=21#wechat_redirect" target="_blank" style="font-size: 14px;text-decoration: underline;" data-linktype="2"><span style="font-size: 14px;">Spring Boot 如何做参数校验？</span></a><br  /></p><p style="margin-top: 10px;max-width: 100%;min-height: 1em;font-size: 16px;white-space: normal;font-family: -apple-system-font, BlinkMacSystemFont, &quot;Helvetica Neue&quot;, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, Arial, sans-serif;text-align: left;background-color: rgb(255, 255, 255);color: rgb(62, 62, 62);box-sizing: border-box !important;overflow-wrap: break-word !important;word-break: normal !important;"><img class="" data-copyright="0" data-ratio="0.5004444444444445" data-s="300,640" src="https://mmbiz.qpic.cn/mmbiz_jpg/TNUwKhV0JpQiar894HDic0yJSCHN19dmct0zTB1I3ib1uiaibB0XWIHOJdXWNmq4ZKHTVL6wS24ThQfY5ibqfqNKLung/640" data-type="jpeg" data-w="1125" style="font-size: 14px;color: rgb(63, 62, 63);letter-spacing: 1px;text-align: right;box-sizing: border-box !important;overflow-wrap: break-word !important;word-break: normal !important;"  /></p><section class="mpa-template" data-mpa-template-id="1536" data-mpa-color="#ffffff" data-mpa-category="引导"><p style="text-align: left;"><br  /></p><section style="display:inline-block;width:30px;"><img class="" data-ratio="1" src="https://mmbiz.qpic.cn/mmbiz_gif/jZXlUHNuBN5a6JWIdk82cPD8FSSoqjutJcFTXQH1jWPa2pUnwgsOkb95nNBTkMiamwxeAHKFba0FdqKDthpdlibQ/640" data-w="400" style="display: inline-block;vertical-align: middle;"  /></section><section style="display:inline-block;vertical-align: middle;font-size: 12px;margin-left:5px;" class="135brush" data-brushtype="text"></section><section style="display:inline-block;vertical-align: middle;font-size: 12px;margin-left:5px;" class="135brush" data-brushtype="text"></section><section style="display:inline-block;vertical-align: middle;font-size: 12px;margin-left:5px;" class="135brush" data-brushtype="text"><span style="font-size: 15px;">点击「</span></section><section style="display:inline-block;vertical-align: middle;font-size: 12px;margin-left:5px;" class="135brush" data-brushtype="text"><span style="font-size: 15px;"><strong><span style="font-size: 15px;color: rgb(0, 82, 255);">阅读原文</span></strong></span></section><section style="display:inline-block;vertical-align: middle;font-size: 12px;margin-left:5px;" class="135brush" data-brushtype="text"><span style="font-size: 15px;">」一起流弊…</span></section></section></section>                </div>
					</div>
				</el-row>
			</el-main>
		</el-container>
		<el-dialog title="关于zyplayer-doc-wiki" :visible.sync="aboutDialogVisible" width="600px">
			<el-form>
				<el-form-item label="项目地址：">
					<a target="_blank" href="https://gitee.com/zyplayer/zyplayer-doc">zyplayer-doc</a>
				</el-form-item>
				<el-form-item label="开发人员：">
					<a target="_blank" href="http://zyplayer.com">暮光：城中城</a>
				</el-form-item>
				<el-form-item label="">
					欢迎加群讨论，QQ群号：466363173，欢迎提交需求，欢迎使用和加入开发！
				</el-form-item>
			</el-form>
		</el-dialog>
	</div>
</body>
<script type="text/javascript" src="webjars/doc-wiki/vue/vue.js"></script>
<script type="text/javascript" src="webjars/doc-wiki/js/element-ui.js"></script>
<!-- ajax 用到了jquery -->
<script type="text/javascript" src="webjars/doc-wiki/js/jquery-3.1.0.min.js"></script>
<script type="text/javascript" src="webjars/doc-wiki/js/common.js"></script>
<script type="text/javascript" src="webjars/doc-wiki/js/toast.js"></script>
<script type="text/javascript" src="webjars/doc-wiki/js/formatjson.js"></script>
<script type="text/javascript" src="webjars/doc-wiki/js/doc-wiki-tree.js"></script>

<script>
	var app = new Vue({
		el: '#app',
		data() {
			return {
				isCollapse: false,
				aboutDialogVisible: false,
				onlineDebugLoading: false,
				docFileList: [
					{name:'开发规范.doc', create: '2019-2-17 19:00:02', creator: '暮光：城中城'}
				],
				pathIndex: [
					{
						label: '研发中心',
						children: [
							{
								label: '狗屎一样的代码如何重构？'
							},{
								label: '开发规范',
							},{
								label: '关于研发中心',
							},
						]
					},
				],
				defaultProps: {
					children: 'children',
					label: 'label'
				},
				// 依据目录树存储的map全局对象
				treePathDataMap: new Map(),
				// 搜索的输入内容
				searchKeywords: "",
			}
		},
		watch: {
		
		},
		mounted: function () {
			//this.doGetServiceList();
		},
		methods: {
			createWiki(){

			},
			handleNodeClick(data) {
				if (data.children == null) {
					var path = data.interface;
				}
			},
			searchByKeywords() {
				app.pathIndex = createTreeViewByTreeWithMerge(app.dubboDocList, app.searchKeywords);
			}
		}
	});

</script>
<style>
	html,body,#app {
		margin: 0;
		padding: 0;
		height: 100%;
	}
	pre{margin: 0;}
	.el-menu {
		box-sizing: border-box;
		border-right: 0;
		margin-right: 3px;
	}
	.doc-body-box{
		overflow-x: hidden;height: calc(100vh);overflow-y: auto;width: 100%;
		padding: 20px;border-left: 1px solid #f1f1f1; box-sizing: border-box;
	}
	.el-tree{margin-right: 3px;}
	.logo{
		background: #409EFF; cursor: pointer;
		width: 100%; height:60px;line-height:60px;font-size: 25px;color: #fff;text-align: center;
	}
	.wiki-title{font-size: 20px;}
	.wiki-author{font-size: 14px;padding: 10px 0;}
	.wiki-content{font-size: 14px;}
</style>
</html>

